package top.v5it.japi.plus.common.func;

import java.util.Objects;

/**
 * 测试函数
 *
 * @author zhanpu
 * @date 2022/5/25
 */
@FunctionalInterface
public interface TestFunc<E extends Throwable> {

    /**
     * 构造条件器
     *
     * @return 返回true或false
     * @throws E 抛出的异常
     */
    boolean require() throws E;

    /**
     * 否定时才处理，不然就抛出异常
     *
     * @return {@link TestFunc}
     */
    default TestFunc<E> negate() {
        return () -> !requireWithFuncException();
    }

    /**
     * 或者条件
     *
     * @param other 其它条件
     * @return {@link TestFunc}
     */
    default TestFunc<E> or(TestFunc<? super E> other) {
        Objects.requireNonNull(other);

        return () -> requireWithFuncException() || other.requireWithFuncException();
    }

    /**
     * 并且条件
     *
     * @param other 其它条件
     * @return {@link TestFunc}
     */
    default TestFunc<E> and(TestFunc<? super E> other) {
        Objects.requireNonNull(other);

        return () -> requireWithFuncException() && other.requireWithFuncException();
    }

    /**
     * 基于本函数返回FuncException
     *
     * @return 返回true或false
     */
    default boolean requireWithFuncException() {
        try {
            return require();
        } catch (Throwable e) {
            throw new FuncException(e);
        }
    }

}
